package org.midi.sh;

import java.awt.*;
/**
 * Contains cards in players hand
 * 
 * @author Sam Cavenagh
 * @version 12/11/02
 * 
 * Website: http://home.pacific.net.au/~cavenagh/SH/
 * Email: cavenaghweb@hotmail.com
 */
public class Hand
{
    Card hand[] = new Card[52];
    Card facedown[] = new Card[3];
    Card faceup[] = new Card[3];

    Point ontable[] = new Point[3];

    //click detection box for cards in hand
    Rectangle cardBox[] = new Rectangle[52];

    //click detection box for cards on table
    Rectangle tableBox[] = new Rectangle[3];

    SHinterface sh;
    Image back;
    Graphics g;

    public Hand(SHinterface sh, Image back, Graphics g){
    this.sh = sh;
    this.back = back;
    this.g = g;
    ontable[0] = new Point(103, 350);
    ontable[1] = new Point(188, 350);
    ontable[2] = new Point(276, 350);

    tableBox[0] = new Rectangle(103, 350, 71, 96);
    tableBox[1] = new Rectangle(188, 350, 71, 96);
    tableBox[2] = new Rectangle(276, 350, 71, 96);
    }

    public Hand()
    {}

    //is there any cards facing up ?
    public boolean isFaceUp()
    {
    if(faceup[0] != null || faceup[1] != null || faceup[2] != null)
        return true;
    return false;
    }

    //is there any cards facing down ? or only 1 card facing down
    public boolean isFaceDown()
    {
    if(facedown[0] == null && facedown[1] == null && facedown[2] == null)
        return false;
    if(facedown[1] == null && facedown[2] == null)
        return false;
    if(facedown[0] == null && facedown[2] == null)
        return false;
    if(facedown[0] == null && facedown[1] == null)
        return false;
    return true;
    }

    public void swap(Card[] inhand, Card[] ontable)
    {
    for(int n = 0; n < 3; n++){
        hand[n] = inhand[n];
        faceup[n] = ontable[n];
    }
    }

    public int mouseClick(int mouseX, int mouseY)
    {
    //counting number of cards in hand
    int cardCount = length();
    if(cardCount == 1){
        for(int n = 0; n < 3; n++)
            if(tableBox[n].contains(mouseX, mouseY))
                if(selectionValid(n))
                    return n;
    }
    //Checking for click inside card
    for(int n = 0; n < cardCount - 1; n++)
    if(cardBox[n].contains(mouseX, mouseY)){
        return n;
    }
    return -1;
    }
    
    public boolean selectionValid(int selection)
    {
    if(isFaceUp()){
        if(faceup[selection] == null)
            return false;
    }else{
        if(facedown[selection] == null)
            return false;
    }
    return true;
    }

    //Draw Cards in hand on screen
    public void showHand()
    {
    //counting number of cards in hand
    int cardCount = length();

    int xfactor;
    if(cardCount <= 20)
        xfactor = 450 / cardCount;
    else
        xfactor = 450 / 21;
    int shiftfactor = 38;
    if(xfactor - shiftfactor < 0)
    shiftfactor = xfactor;

    //Drawing the cards
    for(int n = 0; n < 52; n++){
        if(hand[n] == null)
            break;

        int x = (int)(xfactor * (n + 1) - shiftfactor);
        int y = 453;

        if(n > 20){
            x = (int)(xfactor * (n - 20) - shiftfactor);
            y = 485;
        }

        if(n > 41){
            x = (int)(xfactor * (n - 41) - shiftfactor);
            y = 515;
        }

        hand[n].drawCard2(x, y);

        //creating cardBox
        
        //setting card height
        int height = 96;//default height
        if(cardCount > 22){//if more than 22 card there must be an over lay
            //cardCount = total number of cards
            //n = where this card is in the hand, ie 0 is first
            if( n < 21 && cardCount - n - 20 > 0)
                height = 32;
            if( cardCount > 43 && n < 42)//if more than 43 card must over lay 3 times
                height = 30;
        }
  
        int n2 = n;

        if(n2 > 21)
            n2 = 22;
        int width = (xfactor * (n2 + 2) - shiftfactor) - x;
        if(n > 20)
            width = (int)(xfactor * (n - 19) - shiftfactor) - x;
        if(n > 41)
            width = (int)(xfactor * (n - 40) - shiftfactor) - x;

        if( width > 71)
            width = 71;
        if(n + 2 == cardCount || n == 21 || n == 42)
            width = 71;

        cardBox[n] = new Rectangle(x, y, width, height);
    }

    for(int n = 0; n < 3; n++)
        if(faceup[n] != null)
            faceup[n].drawCard(ontable[n]);
        else if(facedown[n] != null)
            g.drawImage(back, (int)ontable[n].getX(), (int)ontable[n].getY(), sh);
    }

    //Add cards during dealing, this adds cards to facedown then faceup then hand
    public void deal(Card card)
    {
    boolean added = false;
    for(int n = 0; n < 3; n++)
        if(facedown[n] == null){
            facedown[n] = card;
            added = true;
            break;
        }
    if(!added)
    for(int n = 0; n < 3; n++)
        if(faceup[n] == null){
            faceup[n] = card;
            added = true;
            break;
        }
    if(!added)
    addCard(card);
    }

    //Adds card to hand, card is added to correct position 
    public void addCard(Card card)
    {
    for(int n = 0; n < hand.length; n++){
        if(hand[n] == null){
            hand[n] = card;
            break;
        }else if(hand[n].getValue() >= card.getValue()){
            Card temp = hand[n];
            hand[n] = card;
            for(int s = length(); s >= n + 1 ; s--)
                if(s + 1 < 52)
                    hand[s + 1] = hand[s];
            hand[n + 1] = temp;
            break;
        }
    }
    }

    //Removing card from hand then reordering hand
    public void removeCard(int cardno)
    {
    for(int n = cardno; n < length(); n++){
        if(hand[n] == null)
            break;
        if(n + 1 < 52)
        hand[n] = hand[n + 1];
    }
    hand[length() -1] = null;
    }

    public void removeAll()
    {
    for(int n = 0; n < 3; n++){
        faceup[n] = null;
        facedown[n] = null;
    }
    for(int n = 0; n < 52; n++)
        hand[n] = null;
        
    }

    public Card getCard(int cardno)
    {
    return hand[cardno];
    }

    public Card getFaceUp(int cardno)
    {
    return faceup[cardno];
    }

    public void removeFaceUp(int cardno)
    {
    faceup[cardno] = null;
    }

    public void removeFaceDown(int cardno)
    {
    facedown[cardno] = null;
    }

    public Card getFaceDown(int cardno)
    {
    return facedown[cardno];
    }

    public int length()
    {
    int cardCount = 1;
    for(int n = 0; n < 52; n++){
        if(hand[n] == null)
            break;
        cardCount++;
    }
    return cardCount;
    }

}
